package com.ygp.dtp.core.handler;

import com.google.common.collect.Lists;
import com.ygp.dtp.common.dto.ThreadPoolState;
import com.ygp.dtp.core.monitor.collector.MetricsCollector;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Objects;
import java.util.ServiceLoader;

/**
 * @description: 监听收集处理类，请看monitor包下
 * @motto: 代码源于生活，高于生活艺术
 * @author: zhouhengzhe
 * @date: 2022/8/9 09:54
 * @since 1.0
 **/
@Slf4j
public class CollectorHandler {
    private static final List<MetricsCollector> METRICS_COLLECTORS = Lists.newCopyOnWriteArrayList();
    /**
     * 加载类
     */
    public CollectorHandler() {
        //spi机制，看META-INF/services/com.ygp.dtp.core.monitor.collector.MetricsCollector
        ServiceLoader<MetricsCollector> load = ServiceLoader.load(MetricsCollector.class);
        //放入list中
        load.forEach(METRICS_COLLECTORS::add);
    }

    /**
     * 收集
     *
     * @param threadPoolState
     * @param type
     */
    public void collect(ThreadPoolState threadPoolState, String type) {
        if (Objects.isNull(threadPoolState)) {
            return;
        }
        METRICS_COLLECTORS.forEach(i -> {
            if (i.support(type)) {
                i.collect(threadPoolState);
            }
        });
    }

    /**
     * 单例模式
     *
     * @return 单例
     */
    public static CollectorHandler getInstance() {
        return CollectorHandlerHolder.INSTANCE;
    }

    /**
     * 本次使用的是静态内部类创建单例（推荐使用）,也可以使用枚举，双重检查，饿汉式（静态代码块），饿汉式（静态常量）
     */
    private static class CollectorHandlerHolder {
        private static final CollectorHandler INSTANCE = new CollectorHandler();
    }
}
